package secu;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.function.Consumer;

/**
 * SHA测试
 * 英语：Secure Hash Algorithm，缩写为SHA
 * 是一个密码散列函数家族，是FIPS所认证的安全散列算法
 * FIPS：Federal Information Processing Standards，联邦信息处理标准
 * SHA家族的五个算法，分别是SHA-1、SHA-224、SHA-256、SHA-384，和SHA-512，
 * 由美国国家安全局（NSA）所设计，并由美国国家标准与技术研究院（NIST）发布；是美国的政府标准。
 * @author ben
 * @date 2021-09-26 22:02:18 CST
 */
public class TestSha {

	public static Consumer<Object> cs = System.out::println;

	public static void main(String[] args) {
		test1("sha");
		test1("sha-1");
		test1("sha-224");
		test1("sha-256");
		test1("sha-384");
		test1("sha-512");
	}

	/**
	 * sha
	 * @author ben
	 * @date 2021-09-26 22:07:49 CST
	 * @param alg 算法名
	 */
	public static void test1(String alg) {
		cs.accept("test1() start...alg=" + alg);
		try {
			MessageDigest sha = MessageDigest.getInstance(alg);
			cs.accept("sha=" + sha);
			cs.accept("sha=" + sha.getAlgorithm());
			cs.accept("sha=" + sha.getDigestLength());
			cs.accept("sha.provider=" + sha.getProvider());
			cs.accept("sha=" + sha.getProvider().getInfo());
			cs.accept("sha=" + sha.getProvider().getName());
			cs.accept("sha=" + sha.getProvider().getVersion());
			
			byte[] encoded = sha.digest();
			outputByteArr(encoded);

			String str1 = "abc";
			encoded = sha.digest(str1.getBytes());
			outputByteArr(encoded);
			
			
			final String salt = "salt";
			encoded = sha.digest((salt + str1).getBytes());
			outputByteArr(encoded);
			
		} catch (NoSuchAlgorithmException e) {
			cs.accept("发生异常：e=" + e.getMessage());
		}
		
		cs.accept("--------------\n");
	}
	
	private static void outputByteArr(byte[] arr) {
		cs.accept("输出byte[] arr：length=" + arr.length);
		for (int i=0; i<arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		cs.accept("");
		for (int i=0; i<arr.length; i++) {
			System.out.printf("%02x ", arr[i]);
		}
		cs.accept("");
		StringBuffer sb = new StringBuffer();
		for (int i=0; i<arr.length; i++) {
			sb.append(Integer.toHexString((0x000000FF & arr[i]) | 0xFFFFFF00).substring(6)).append(" ");
		}
		cs.accept(sb.toString());
	}
	
}
